// var i;
// var $bundleConfig = require("./BundleConfig");
// var $resKeeper = require("./ResKeeper");
// var $excel = require("./Excel");
// var $nodePoolMag = require("./NodePoolMag");
// var $uI_BulletBombCollider = require("./UI_BulletBombCollider");
// var f = cc._decorator;
// var g = f.ccclass;
// var _ = f.property;
// var y = f.inspector;
// var m = (function (e) {
//     function t() {
//         var t = (null !== e && e.apply(this, arguments)) || this;
//         t.bulletId = 1;
//         t.nowbox = null;
//         t.spr = null;
//         t.attack = 0;
//         t.attackfanwei = 0;
//         t.isbaoji = !1;
//         t.attackfang = null;
//         t.nowdirection = 0;
//         t.nowpos = null;
//         t.tw = null;
//         t.createtime = 0;
//         t.ispengzhuang = !1;
//         t.bulletspeed = 40;
//         t.issend = !1;
//         return t;
//     }
//     __extends(t, e);
//     t.prototype.initBullet = function (e, t) {
//         return __awaiter(this, void 0, void 0, function () {
//             var o;
//             var n;
//             var i;
//             var a;
//             var r;
//             return __generator(this, function (c) {
//                 switch (c.label) {
//                     case 0:
//                         this.attack = e.attack;
//                         this.attackfang = e.playerId;
//                         this.isbaoji = e.isbaoji;
//                         o = e.skinlevel;
//                         this.createtime = new Date().getTime();
//                         return [
//                             4,
//                             this._loadRes(
//                                 $bundleConfig.BundleNames.Common,
//                                 "res/player/player8_" + (o + 1),
//                                 cc.SpriteFrame
//                             )
//                         ];
//                     case 1:
//                         n = c.sent();
//                         this.spr.spriteFrame = n;
//                         this.nowpos = t;
//                         i = cc.v2();
//                         cc.Vec2.subtract(i, cc.v2(t.x, t.y), this.node.getPosition());
//                         this.nowdirection = Math.atan2(i.y, i.x);
//                         this.issend = !0;
//                         if ((a = $excel.Excel.shuiguobuff(this.attackfang.sgtianfuid))) {
//                             this.attackfanwei = a.value[0];
//                         }
//                         if (this.tw) {
//                             this.tw.stop();
//                         }
//                         r = cc
//                             .tween(this.spr.node)
//                             .to(0.5, {
//                                 scale: 0.9
//                             })
//                             .to(0.5, {
//                                 scale: 1
//                             });
//                         this.tw = cc.tween(this.spr.node).repeatForever(r).start();
//                         return [2];
//                 }
//             });
//         });
//     };
//     t.prototype.getBombFanWei = function () {
//         return this.attackfanwei;
//     };
//     t.prototype.sendBullet1 = function () {
//         this.moveBullet(this.nowdirection);
//     };
//     t.prototype.moveBullet = function (e) {
//         var t = cc.Vec2.distance(cc.v2(this.nowpos.x, this.nowpos.y), this.node.getPosition());
//         var o = this.bulletspeed;
//         if (t < this.bulletspeed) {
//             o = t;
//         }
//         this.node.x += Math.cos(e) * o;
//         this.node.y += Math.sin(e) * o;
//         if ((t = cc.Vec2.distance(cc.v2(this.nowpos.x, this.nowpos.y), this.node.getPosition())) <= 10) {
//             this.issend = !1;
//             this.node.x = this.nowpos.x;
//             this.node.y = this.nowpos.y;
//         }
//     };
//     t.prototype.getBulletAttack = function () {
//         return this.attack;
//     };
//     t.prototype.getNowMosterNode = function () {
//         var e = this.attackfang.mosterNodes.children;
//         var t = [];
//         for (var o = 0; o < e.length; o++) {
//             var n = e[o];
//             var i = cc.Vec2.distance(n.getPosition(), this.node.getPosition());
//             if ((i -= n.width / 2 + this.node.width / 2) <= this.attackfanwei) {
//                 t.push(n);
//             }
//         }
//         return t;
//     };
//     t.prototype.hideBullet = function () {
//         this.issend = !1;
//         $nodePoolMag.NodePoolMag.instance.recycleNode("bullet_2", this.node);
//     };
//     t.prototype.setBoxState = function (e) {
//         this.ispengzhuang = e;
//     };
//     t.prototype.onUpdate = function () {
//         if (this.issend) {
//             this.sendBullet1();
//         }
//     };
//     t.prototype.pengZhuangMoster = function (e) {
//         if (this.ispengzhuang) {
//             var t = e.children;
//             for (var o = 0; o < t.length; o++) {
//                 var n = t[o];
//                 if (cc.Vec2.distance(n.getPosition(), this.node.getPosition()) <= 20) {
//                     this.nowbox.getComponent($uI_BulletBombCollider.default).onMyCollisionEntyer(n);
//                     break;
//                 }
//             }
//         }
//     };
//     __decorate([_()], t.prototype, "bulletId", void 0);
//     __decorate([_(cc.Node)], t.prototype, "nowbox", void 0);
//     __decorate([_(cc.Sprite)], t.prototype, "spr", void 0);
//     return __decorate([g], t);
// })($resKeeper.default);
// exports.default = m;

// import { BundleNames } from './BundleConfig';
// import ResKeeper from './ResKeeper';
// import { Excel } from './Excel';
// import { NodePoolMag } from './NodePoolMag';
// import UI_BulletBombCollider from './UI_BulletBombCollider';

// const { ccclass, property, inspector } = cc._decorator;

// /**
//  * 子弹类
//  * 建议类名：Bullet
//  */
// @ccclass
// export default class UI_BulletBomb extends ResKeeper {
//     @property
//     bulletId: number = 1;

//     @property(cc.Node)
//     nowbox: cc.Node | null = null;

//     @property(cc.Sprite)
//     spr: cc.Sprite | null = null;

//     attack: number = 0;
//     attackfanwei: number = 0;
//     isbaoji: boolean = false;
//     attackfang: any = null;
//     nowdirection: number = 0;
//     nowpos: cc.Vec2 | null = null;
//     tw: cc.Tween | null = null;
//     createtime: number = 0;
//     ispengzhuang: boolean = false;
//     bulletspeed: number = 40;
//     issend: boolean = false;

//     constructor() {
//         super();
//     }

//     /**
//      * 初始化子弹
//      * @param e 子弹参数
//      * @param t 目标位置
//      * 建议方法名：initializeBullet
//      */
//     async initBullet(e: any, t: cc.Vec2): Promise<void> {
//         this.attack = e.attack;
//         this.attackfang = e.playerId;
//         this.isbaoji = e.isbaoji;
//         const skinLevel = e.skinlevel;
//         this.createtime = new Date().getTime();

//         const spriteFrame = await this._loadRes(
//             BundleNames.Common,
//             `res/player/player8_${skinLevel + 1}`,
//             cc.SpriteFrame
//         );

//         if (this.spr) {
//             this.spr.spriteFrame = spriteFrame;
//         }

//         this.nowpos = t;
//         const directionVector = cc.v2();
//         cc.Vec2.subtract(directionVector, cc.v2(t.x, t.y), this.node.getPosition());
//         this.nowdirection = Math.atan2(directionVector.y, directionVector.x);
//         this.issend = true;

//         const buff = Excel.shuiguobuff(this.attackfang.sgtianfuid);
//         if (buff) {
//             this.attackfanwei = buff.value[0];
//         }

//         if (this.tw) {
//             this.tw.stop();
//         }

//         const tween = cc.tween(this.spr.node)
//             .to(0.5, { scale: 0.9 })
//             .to(0.5, { scale: 1 });

//         this.tw = cc.tween(this.spr.node).repeatForever(tween).start();
//     }

//     /**
//      * 获取爆炸范围
//      * @returns 爆炸范围
//      * 建议方法名：getExplosionRange
//      */
//     getBombFanWei(): number {
//         return this.attackfanwei;
//     }

//     /**
//      * 发送子弹
//      * 建议方法名：fireBullet
//      */
//     sendBullet1(): void {
//         this.moveBullet(this.nowdirection);
//     }

//     /**
//      * 移动子弹
//      * @param direction 方向
//      * 建议方法名：moveBulletInDirection
//      */
//     moveBullet(direction: number): void {
//         const distance = cc.Vec2.distance(cc.v2(this.nowpos.x, this.nowpos.y), this.node.getPosition());
//         let speed = this.bulletspeed;

//         if (distance < this.bulletspeed) {
//             speed = distance;
//         }

//         this.node.x += Math.cos(direction) * speed;
//         this.node.y += Math.sin(direction) * speed;

//         const newDistance = cc.Vec2.distance(cc.v2(this.nowpos.x, this.nowpos.y), this.node.getPosition());
//         if (newDistance <= 10) {
//             this.issend = false;
//             this.node.x = this.nowpos.x;
//             this.node.y = this.nowpos.y;
//         }
//     }

//     /**
//      * 获取子弹攻击力
//      * @returns 攻击力
//      * 建议方法名：getBulletDamage
//      */
//     getBulletAttack(): number {
//         return this.attack;
//     }

//     /**
//      * 获取当前怪物节点
//      * @returns 怪物节点数组
//      * 建议方法名：getCurrentMonsterNodes
//      */
//     getNowMosterNode(): cc.Node[] {
//         const monsterNodes = this.attackfang.mosterNodes.children;
//         const result: cc.Node[] = [];

//         for (const node of monsterNodes) {
//             const distance = cc.Vec2.distance(node.getPosition(), this.node.getPosition());
//             if (distance - node.width / 2 - this.node.width / 2 <= this.attackfanwei) {
//                 result.push(node);
//             }
//         }

//         return result;
//     }

//     /**
//      * 隐藏子弹
//      * 建议方法名：hideBullet
//      */
//     hideBullet(): void {
//         this.issend = false;
//         NodePoolMag.instance.recycleNode('bullet_2', this.node);
//     }

//     /**
//      * 设置盒子状态
//      * @param state 碰撞状态
//      * 建议方法名：setCollisionState
//      */
//     setBoxState(state: boolean): void {
//         this.ispengzhuang = state;
//     }

//     /**
//      * 更新方法
//      * 建议方法名：update
//      */
//     onUpdate(deltaTime: number): void {
//         if (this.issend) {
//             this.sendBullet1();
//         }
//     }

//     /**
//      * 碰撞怪物
//      * @param e 怪物节点
//      * 建议方法名：collideWithMonster
//      */
//     pengZhuangMoster(e: cc.Node): void {
//         if (this.ispengzhuang) {
//             const children = e.children;
//             for (const child of children) {
//                 if (cc.Vec2.distance(child.getPosition(), this.node.getPosition()) <= 20) {
//                     this.nowbox.getComponent(UI_BulletBombCollider).onMyCollisionEnter(child);
//                     break;
//                 }
//             }
//         }
//     }
// }

import { BundleNames } from './BundleConfig';
import ResKeeper from './ResKeeper';
import { Excel } from './Excel';
import { NodePoolMag } from './NodePoolMag';
import ViewBulletBombCollider from './UI_BulletBombCollider';

const { ccclass, property, inspector } = cc._decorator;

/**
 * 子弹类
 * 建议类名：Bullet
 */
@ccclass
export default class ViewBulletBomb extends ResKeeper {
    @property
    bulletId: number = 1;

    @property(cc.Node)
    nowbox: cc.Node | null = null;

    @property(cc.Sprite)
    spr: cc.Sprite | null = null;

    attack: number = 0;
    attackfanwei: number = 0;
    isbaoji: boolean = false;
    attackfang: any = null;
    nowdirection: number = 0;
    nowpos: cc.Vec2 | null = null;
    tw: cc.Tween | null = null;
    createtime: number = 0;
    ispengzhuang: boolean = false;
    bulletspeed: number = 40;
    issend: boolean = false;

    constructor() {
        super();
    }

    /**
     * 初始化子弹
     * @param bulletParams 子弹参数
     * @param targetPos 目标位置
     * 建议方法名：initializeBullet
     */
    async initializeBullet(bulletParams: any, targetPos: cc.Vec2): Promise<void> {
        this.attack = bulletParams.attack;
        this.attackfang = bulletParams.playerId;
        this.isbaoji = bulletParams.isbaoji;
        const skinLevel = bulletParams.skinlevel;
        this.createtime = new Date().getTime();

        const spriteFrame = await this._loadRes(
            BundleNames.Common,
            `res/player/player8_${skinLevel + 1}`,
            cc.SpriteFrame
        );

        if (this.spr) {
            this.spr.spriteFrame = spriteFrame;
        }

        this.nowpos = targetPos;
        const directionVector = cc.v2();
        cc.Vec2.subtract(directionVector, cc.v2(targetPos.x, targetPos.y), this.node.getPosition());
        this.nowdirection = Math.atan2(directionVector.y, directionVector.x);
        this.issend = true;

        const buff = Excel.shuiguobuff(this.attackfang.sgtianfuid);
        if (buff) {
            this.attackfanwei = buff.value[0];
        }

        if (this.tw) {
            this.tw.stop();
        }

        const tween = cc.tween(this.spr.node)
            .to(0.5, { scale: 0.9 })
            .to(0.5, { scale: 1 });

        this.tw = cc.tween(this.spr.node).repeatForever(tween).start();
    }

    /**
     * 获取爆炸范围
     * @returns 爆炸范围
     * 建议方法名：getExplosionRange
     */
    getExplosionRange(): number {
        return this.attackfanwei;
    }

    /**
     * 发送子弹
     * 建议方法名：fireBullet
     */
    fireBullet1(): void {
        this.moveBulletInDirection(this.nowdirection);
    }

    /**
     * 移动子弹
     * @param direction 方向
     * 建议方法名：moveBulletInDirection
     */
    moveBulletInDirection(direction: number): void {
        const distance = cc.Vec2.distance(cc.v2(this.nowpos!.x, this.nowpos!.y), this.node.getPosition());
        let speed = this.bulletspeed;

        if (distance < this.bulletspeed) {
            speed = distance;
        }

        this.node.x += Math.cos(direction) * speed;
        this.node.y += Math.sin(direction) * speed;

        const newDistance = cc.Vec2.distance(cc.v2(this.nowpos!.x, this.nowpos!.y), this.node.getPosition());
        if (newDistance <= 10) {
            this.issend = false;
            this.node.x = this.nowpos!.x;
            this.node.y = this.nowpos!.y;
        }
    }

    /**
     * 获取子弹攻击力
     * @returns 攻击力
     * 建议方法名：getBulletDamage
     */
    getBulletAttack(): number {
        return this.attack;
    }

    /**
     * 获取当前怪物节点
     * @returns 怪物节点数组
     * 建议方法名：getCurrentMonsterNodes
     */
    getCurrentMonsterNodes(): cc.Node[] {
        const monsterNodes = this.attackfang.mosterNodes.children;
        const result: cc.Node[] = [];

        for (const node of monsterNodes) {
            const distance = cc.Vec2.distance(node.getPosition(), this.node.getPosition());
            if (distance - node.width / 2 - this.node.width / 2 <= this.attackfanwei) {
                result.push(node);
            }
        }

        return result;
    }

    /**
     * 隐藏子弹
     * 建议方法名：hideBullet
     */
    hideBullet(): void {
        this.issend = false;
        NodePoolMag.instance.recycleNodeToPool('bullet_2', this.node);
    }

    /**
     * 设置盒子状态
     * @param state 碰撞状态
     * 建议方法名：setCollisionState
     */
    setBoxState(state: boolean): void {
        this.ispengzhuang = state;
    }

    /**
     * 更新方法
     * 建议方法名：update
     */
    onUpdate(deltaTime: number): void {
        if (this.issend) {
            this.fireBullet1();
        }
    }

    /**
     * 碰撞怪物
     * @param monsterNode 怪物节点
     * 建议方法名：collideWithMonster
     */
    collideWithMonster(monsterNode: cc.Node): void {
        if (this.ispengzhuang) {
            const children = monsterNode.children;
            for (const child of children) {
                if (cc.Vec2.distance(child.getPosition(), this.node.getPosition()) <= 20) {
                    this.nowbox!.getComponent(ViewBulletBombCollider).handleMyCollisionEnter(child);
                    break;
                }
            }
        }
    }
}